#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN = 3005;
int _, n, A[MAXN], B[MAXN * 2], Rnk[MAXN];
bool LE[MAXN][MAXN], EQ[MAXN][MAXN], GE[MAXN][MAXN];
char S[MAXN];
namespace SA{
  int sa[MAXN],rk[MAXN],id[MAXN];
  bool Vis[MAXN];
  struct JYCNB{
    int a,b,id;
    bool operator<(const JYCNB&data)const{
      return a<data.a||a==data.a&&b<data.b;
    }
  }A[MAXN];
  bool check(){
    memset(Vis, 0, sizeof(Vis));
    for(int i=1;i<=n;i++) Vis[S[i]]=1;
    for(int i=0;i<256;i++) id[i]=(i?id[i-1]:0)+Vis[i];
    for(int i=1;i<=n;i++) rk[i]=id[S[i]];
    for(int k=1;k<=n;k<<=1){
      for(int i=1;i<=n;i++){
        A[i].a=rk[i],A[i].id=i;
        A[i].b=i+k>n?0:rk[i+k];
      }
      sort(A+1,A+n+1);int val=1;
      for(int i=1;i<=n;i++){
        if(i>1&&A[i-1]<A[i]) val++;
        rk[A[i].id]=val;
      }
      if(val==n) break;
    }
    for(int i=1;i<=n;i++) sa[rk[i]]=i;
    // for(int i = 1; i <= n; i++) cerr << sa[i] << ' '; cerr << endl;
    // for(int i = 1; i <= n; i++) cerr << ::A[i] << ' '; cerr << endl;
    for(int i = 1; i <= n; i++) if(sa[i] != ::A[i]) return 0;
    return 1;
  }
}
namespace MANACHER{
  int D[MAXN * 2];
  char T[MAXN * 2];
  bool check(){
    memset(T, 0, sizeof(T));
    memset(D, 0, sizeof(D));
    int m = (n + 1) << 1;
    for(int i = n; i     ; i--) T[ i      << 1 | 1] = S[i];
    for(int i = 0; i <= n; i++) T[(i + 1) << 1    ] = '|';
    T[1] = '~'; int l = 1, r = 0;
    for(int i = 1; i <= m; i++){
      if(i <= r) D[i] = min(r - i + 1, D[l + r - i]);
      while(T[i - D[i]] == T[i + D[i]]) D[i]++;
      if(i + D[i] - 1 > r) r = i + D[i] - 1, l = i - D[i] + 1;
    }
    // for(int i = 3; i <  m; i++) cerr << D[i] << ' '; cerr << endl;
    // for(int i = 1; i <= n * 2 - 1; i++) cerr << B[i] << ' '; cerr << endl;
    for(int i = 3; i <  m; i++) if(D[i] - 1 != B[i - 2]) return 0;
    return 1;
  }
}
namespace WORK{
  constexpr int maxn = MAXN, maxe = MAXN * MAXN * 2;
  bool Vis[maxn];
  int N,tot,Cnt[maxn],Fa[maxn],lnk[maxn],nxt[maxe],son[maxe],w[maxe],Dis[maxn],Q[maxn];
  inline void add_e(int x,int y,int z){son[++tot]=y,nxt[tot]=lnk[x],w[lnk[x]=tot]=z;}
  bool SPFA(){
    memset(Vis, 0, sizeof(Vis));
    memset(Cnt, 0, sizeof(Cnt));
    memset(lnk, 0, sizeof(lnk));
    memset(nxt, 0, sizeof(nxt));
    memset(Dis, 0, sizeof(Dis));
    for(int i = 1; i <= n; i++) add_e(0, i, 0);
    for(int i = 1; i <= n; i++) for(int j = i + 1; j <= n; j++){
      // cerr << i << ',' << j << ':' << LE[i][j] << EQ[i][j] << GE[i][j] << endl;
      if(!LE[i][j]) add_e(i, j, -!EQ[i][j]);
      if(!GE[i][j]) add_e(j, i, -!EQ[i][j]);
    }
    N = n, tot = 0;
    int hed=0,til=1;Vis[0]=1;
    memset(Dis,0x3F,sizeof Dis),Dis[0]=0;
    while(hed!=til){
      Vis[Q[hed]]=0;
      if(++Cnt[Q[hed=(hed+1)%maxn]]>N) return 0;
      for(int j=lnk[Q[hed]];j;j=nxt[j]) if(Dis[Q[hed]]+w[j]<Dis[son[j]]){
        Dis[son[j]]=Dis[Q[hed]]+w[j];
        if(!Vis[son[j]]){
          Vis[Q[til=(til+1)%maxn]=son[j]]=1;
          int nck=(hed+1)%maxn;
          if(Dis[Q[til]]<Dis[Q[nck]]) swap(Q[til],Q[nck]);
        }
      }
    }
    int mn = 0;
    for(int i = 1; i <= n; i++) mn = min(mn, Dis[i]);
    for(int i = 1; i <= n; i++) if((S[i] = 'a' + Dis[i] - mn) > 'z') return 0;
    return 1;
  }
}
bool gt(int i, int j){
  for(int k = 0; j + k <= n; k++){
    if(GE[i + k][j + k]) return 1; else if(!EQ[i + k][j + k]) return 0;
  }
  return 1;
}
bool le(int i, int j){
  for(int k = 0; j + k <= n; k++){
    if(LE[i + k][j + k]) return 1; else if(!EQ[i + k][j + k]) return 0;
  }
  return 0;
}
int main(){
  freopen("string.in", "r", stdin);
  freopen("string.out", "w", stdout);
  cin.tie(nullptr)->sync_with_stdio(false);
  for(cin >> _; _--;){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> A[i], Rnk[++A[i]] = i;
    for(int i = 1; i <= 2 * n - 1; i++) cin >> B[i];
    memset(LE, 1, sizeof(LE)), memset(EQ, 1, sizeof(EQ)), memset(GE, 1, sizeof(GE));
    for(int i = 1; i <= n; i++){
      int x = (B[i * 2 - 1] + 1) >> 1;
      if(i - x <= 0 || i + x > n) continue;
      EQ[i - x][i + x] = 0;
      for(int j = 0; j < x; j++) if(i - j > 0 && i + j <= n)
        LE[i - j][i + j] = GE[i - j][i + j] = 0;
    }
    for(int i = 1; i <  n; i++){
      int x = B[i * 2] >> 1;
      if(i - x <= 0 || i + x + 1 > n) continue;
      EQ[i - x][i + x + 1] = 0;
      for(int j = 0; j < x; j++) if(i - j > 0 && i + j + 1 <= n)
        LE[i - j][i + j + 1] = GE[i - j][i + j + 1] = 0;
    }
    for(int i = n; i; i--) for(int j = 1; j < i; j++) if(Rnk[j] < Rnk[i]){
      GE[j][i] = 0; if(!le(j + 1, i + 1)) EQ[j][i] = 0;
    } else {
      LE[j][i] = 0; if(!gt(j + 1, i + 1)) EQ[j][i] = 0;
    }
    cout << (WORK::SPFA() && SA::check() && MANACHER::check()? S + 1: "-1") << '\n';
  }
  return 0;
}
